
#include "CUserEquip.h"
#include "CEquipMgr.h"
#include "../mainctrl.h"

int CUserEquip::CreateEquip(unsigned int uiEquipID, unsigned short usEquipConfigID, unsigned short usStrengthLevel, CSingleEquip & stEquip)
{
    stEquip.Clear();
    stEquip._uiEquipID = uiEquipID;
    stEquip._usEquipConfigID = usEquipConfigID;    
    stEquip._usStrengthenLevel = usStrengthLevel;
    
    uint64 ui64EquipKey = CMainCtrl::m_pstMain->m_stEquipMgr.MakeEquipKey(_uiGID, uiEquipID);
    int iIndex = _stEquipHash.HashFind(ui64EquipKey);
    if (iIndex >= 0)
    {
        return ERROR_EQUIP_ADD_DUPLICATE;
    }

    iIndex = _stEquipHash.HashAlloc(ui64EquipKey);
    if (iIndex < 0)
    {
        return ERROR_EQUIP_FULL;
    }

    _stEquipHash[iIndex] = stEquip;

    //OSS账单
    CMainCtrl::m_pstMain->m_stOssMgr.AddProduceItem(ITEM_TYPE_EQUIP, usEquipConfigID, 1, uiEquipID);

    return 0;
}

int CUserEquip::GetEquipIndex (unsigned int uiEquipId)
{
    uint64 ui64EquipKey = CMainCtrl::m_pstMain->m_stEquipMgr.MakeEquipKey(_uiGID, uiEquipId);    
    return _stEquipHash.HashFind(ui64EquipKey);
}

unsigned int CUserEquip::GetEquipId (unsigned int uiConfigId)
{
    unsigned int  uiEquipId = uiConfigId * EQUIP_CONFIG_ID_MOD + _uiEquipSeqId;

    ++_uiEquipSeqId;    

    return uiEquipId;
}

int CUserEquip::CreateEquip (unsigned short usEquipConfigID, unsigned int & uiEquipId)
{
    uiEquipId = GetEquipId(usEquipConfigID);
    uint64 ui64EquipKey = CMainCtrl::m_pstMain->m_stEquipMgr.MakeEquipKey(_uiGID, uiEquipId);
    int iIndex = _stEquipHash.HashFind(ui64EquipKey);
    if (iIndex >= 0)
    {
        CT_ERROR (("%d, %d", _uiGID, uiEquipId));
        return ERROR_EQUIP_ADD_DUPLICATE;
    }

    iIndex = _stEquipHash.HashAlloc(ui64EquipKey);
    if (iIndex < 0)
    {
        CT_ERROR (("%d, %d", _uiGID, uiEquipId));
        return ERROR_EQUIP_FULL;
    }

    _stEquipHash[iIndex]._uiEquipID = uiEquipId;
    _stEquipHash[iIndex]._usEquipConfigID = usEquipConfigID;

    //OSS账单
    CMainCtrl::m_pstMain->m_stOssMgr.AddProduceItem(ITEM_TYPE_EQUIP, usEquipConfigID, 1, uiEquipId);

    return RET_OK;
}

void CUserEquip::DelEquip (unsigned int uiEquipId)
{
    int iIndex = GetEquipIndex (uiEquipId);
    if (iIndex < 0)
    {
        CT_ERROR(("%d,%d", _uiGID, uiEquipId));
        return ;
    }

    _stEquipHash.HashFreeByIndex(iIndex);

    //OSS账单
    unsigned short usEquipConfigID = 0;
    CMainCtrl::m_pstMain->m_stEquipMgr.GetConfigIdByEquipId(uiEquipId, usEquipConfigID);
    CMainCtrl::m_pstMain->m_stOssMgr.AddConsumeItem(ITEM_TYPE_EQUIP, usEquipConfigID, 1, uiEquipId);

    return;
}

int CUserEquip::CheckBeforeAdd (unsigned short usEquipConfigID)
{
    int iTotalEquipCnt = _stEquipHash.Size(_stEquipHash.USED_LIST);
    if (iTotalEquipCnt >= MAX_EQUIP_COUNT_PER_USER)
    {
        return ERROR_EQUIP_FULL;
    }
    
    if (iTotalEquipCnt >= DEF_SEND_TIPS_EQUIP_CNT)
    {
        CTips stTips;
        stTips._iType = TIPS_EQUIP_FULL;
        CMainCtrl::m_pstMain->SendTips(_uiGID, stTips);        
    }

    return RET_OK;
}

